/**
 ******************************************************************************
 * @file    bsp_rgb.c
 * @author  陈泳行
 * @date    2025/6/16
 * @version v1.0
 * @brief   RGB灯驱动实现文件，提供RGB颜色转换为PWM信号等相关接口
 ******************************************************************************
 */

#include "bsp_rgb.h"
#include "tim.h"

#define PWM_LOW 67  // 逻辑“0”的占空比
#define PWM_HIGH 143 // 逻辑“1”的占空比

/**
 * @brief  将RGB颜色值转换为PWM信号数据
 * @param  color  输入的RGB颜色结构体
 * @param  buffer PWM数据缓冲区指针，转换结果将写入该缓冲区
 * @param  index  PWM数据写入缓冲区的起始索引
 * @retval 无
 */
void rgb_to_pwm(rgb_color_t color, 
                uint16_t  *buffer, 
                uint16_t    index )
{
	// WS2812数据顺序为GRB
//  uint8_t data[24];
//  for (int i = 0; i < 8; i++) {
//    data[i] = (color.red >> (7 - i)) & 0x01;
//  }
//  for (int i = 0; i < 8; i++) {
//    data[i + 8] = (color.green >> (7 - i)) & 0x01;
//  }
//  for (int i = 0; i < 8; i++) {
//    data[i + 16] = (color.blue >> (7 - i)) & 0x01;
//  }

//  for (int i = 0; i < 24; i++) {
//    if (data[i] == 0) {
//      buffer[index + i] = PWM_LOW;
//    } else {
//      buffer[index + i] = PWM_HIGH;
//    }
//  }
    uint8_t i;
    uint8_t dat[24];
    // 获取RGB颜色的二进制表示
    // 每个颜色分量占8位，总共24位
    for(i = 0; i < 8; i++) {
        dat[i]    = (color.green >> (7 - i)) & 0x01;
        dat[i+8]  = (color.red   >> (7 - i)) & 0x01;
        dat[i+16] = (color.blue  >> (7 - i)) & 0x01;
    }
    // 将24位数据转换为PWM信号
    // 每位数据对应一个PWM信号
    for(i = 0; i < 24; i++) {
        if(dat[i]) {
            buffer[index + i] = PWM_HIGH; // 逻辑“1”
        } else {
            buffer[index + i] = PWM_LOW;  // 逻辑“0”
        }
    }
}

/**
 * @brief  重置DMA缓冲区并重新启动PWM DMA传输
 * @param  pwm_buffer  指向DMA PWM数据缓冲区的指针
 * @param  size        缓冲区元素数量
 * @note   该函数会先停止当前的DMA传输，然后以新的缓冲区和长度重新启动DMA传输。
 *         适用于需要刷新PWM输出数据时调用。
 * @retval 无
 */
void reset_dma_buffer(uint16_t *pwm_buffer, 
					  uint16_t 		  size )
{
    // 停止DMA传输
//    HAL_TIM_PWM_Stop_DMA(&htim1, TIM_CHANNEL_1);

    // 重新启动DMA传输
    HAL_TIM_PWM_Start_DMA(&htim1, 
                          TIM_CHANNEL_1, 
                          (uint32_t *)pwm_buffer, 
                          size );
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	/* Prevent unused argument(s)compilation warning */
	UNUSED(htim);
	/*NOTE : This function should not be modified, when the callbacthe HAL TIM PWM PulseFinishedCallback could be impleme
	*/
	if (htim == &htim1)
	{
		if(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_1)
			HAL_TIM_PWM_Stop_DMA(htim, TIM_CHANNEL_1);
	}
}
